/**
 * @addtogroup brd_crypto
 * brd_crypto
 * @{
 */
/**
 * @file brd_crypto.h
 * @brief 密码板级层
 * @note 
 * @par 修改日志
 * <table>
 * <tr><th>Date       <th>Version   <th>Author      <th>Description 
 * <tr><td>2023-07-19 <td>1.0       <td>软件工程院  <td>创建初始版本
 * @par 示例
 * @code
   handle = Brd_CryptoCreate(0);
   ...
   result = Brd_CryptoPowerSupply(handle, kBrd_PowerSupplyOn);
   result = Brd_CryptoOpen(handle);
   ...
   result = Brd_CryptoSetDeviceId(handle, device_id, len);
   result = Brd_CryptoSetUserId(handle, user_id, len);
    ...
   result = Brd_CryptoGenerateAsymKey(handle, sm2);
   result = Brd_CryptoExportAsymPubKey(handle, sm2, my_pub_key, len);
   result = Brd_CryptoImportAsymPubKey(handle, sm2, his_pub_key, len);
   result = Brd_CryptoEncryptAsym(handle, sm2, plain, plain_len, cipher, cipher_len);
   result = Brd_CryptoDecryptAsym(handle, sm2, cipher, cipher_len, plain, plain_len);
   ...
   result = Brd_CryptoClose(handle);
   Brd_CryptoPowerSupply(kBrd_PowerSupplyOff);
   ...
   Brd_CryptoDestroy(handle);
 * @endcode 
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BRD_CRYPTO_H_
#define _BRD_CRYPTO_H_

#include <ofc_types.h>
#include "brd_common.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 根据标识创建句柄
 * @param id: 标识, 参见[brd_crypto_def.h](@ref Brd_TCryptoIdTag)
 * @return 当返回值为非 NULL 时, 表示创建成功, \n
 *         当返回值为 NULL 时, 表示创建失败, 原因为类型不支持
 */
Brd_THandle Brd_CryptoCreate(Int32 id);

/**
 * 释放句柄
 * @param handle: 句柄
 * @return 无返回值
 */
Int32 Brd_CryptoDestroy(Brd_THandle handle);

/**
 * 获取标识
 * @param handle: 句柄
 * @return 返回用于创建句柄的标识
 */
Int32 Brd_CryptoId(Brd_THandle handle);

/**
 * 设备供电
 * @note 设备操作的前提, 需要先供电, 所有操作完成后需要停止供电以降低功耗
 * @param handle: 句柄
 * @param power: 设备供电类型, 参见[brd_def](@ref Brd_TPowerSupplyTag)
 * @return 当返回值 >= 0 时, 表示控制成功 \n
 *         当返回值 < 0 时, 表示控制失败参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoPowerSupply(Brd_THandle handle, Int32 power);

/**
 * 打开设备
 * @param handle: 句柄
 * @return 当返回值 >= 0 时, 表示打开成功 \n
 *         当返回值 < 0 时, 表示打开失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoOpen(Brd_THandle handle);

/**
 * 关闭设备
 * @param handle: 句柄
 * @return 当返回值 >= 0 时, 表示关闭成功 \n
 *         当返回值 < 0 时, 表示关闭失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoClose(Brd_THandle handle);

/**
 * 设置缓冲区
 * 缓冲区用于内部算法开销
 * @param handle: 句柄
 * @param buffer: 缓冲区起始地址
 * @param size: 缓冲区尺寸
 * @return 无返回值
 */
Int32 Brd_CryptoSetBuffer(Brd_THandle handle, void* buffer, Int32 size);

/**
 * 设备复位信号, 用于复位加密芯片
 * @param handle: 句柄
 *        enable: 当为True时, 使能复位信号, 当为False时, 禁止复位信号
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoReset(Brd_THandle handle, Bool enable);

/**
 * 设置设备ID
 * @note 设备ID硬件原因只能写一次, 故请慎重操作
 * @param handle: 句柄
 *        device_id: 存放设备ID的缓存
 *        len: 设备ID长度
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoSetDeviceId(Brd_THandle handle, const void* device_id, Int32 len);

/**
 * 读取设备ID
 * @param handle: 句柄
 *        device_id: 存放设备ID的缓存
 *        len: 设备ID长度
 * @return 当返回值 >= 0 时, 返回实际读取的设备ID长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoGetDeviceId(Brd_THandle handle, void* device_id, Int32 len);

/**
 * 设置用户ID
 * @param handle: 句柄
 *        user_id: 存放用户ID的缓存
 *        len: 用户ID长度
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoSetUserId(Brd_THandle handle, const void* user_id, Int32 len);

/**
 * 读取用户ID
 * @param handle: 句柄
 *        user_id: 存放用户ID的缓存
 *        len: 用户ID长度
 * @return 当返回值 >= 0 时, 返回实际读取的用户ID长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoGetUserId(Brd_THandle handle, void* user_id, Int32 len);

/** ################################### 对称加密算法接口 ######################################## */

/**
 * 判断对称算法密钥是否为空
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        key_index: 密钥索引
 *        empty: 密钥是否为空
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoIsSymKeyEmpty(Brd_THandle handle, Int32 sym_algo, Int32 key_index, Bool* empty);

/**
 * 产生对称算法密钥
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoGenerateSymKey(Brd_THandle handle, Int32 sym_algo);

/**
 * 产生对称算法密钥, 定制化
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        key_custom: 定制化密钥数据, 参见对应算法的KeyCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoGenerateSymKeyCustom(Brd_THandle handle, Int32 sym_algo, void* key_custom);

/**
 * 导入对称算法密钥
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        key: 密钥数据
 *        key_len: 密钥数据长度
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoImportSymKey(Brd_THandle handle, Int32 sym_algo, const void* key, Int32 key_len);

/**
 * 导入对称算法密钥, 定制化
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        key_custom: 定制化密钥数据, 参见对应算法的KeyCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoImportSymKeyCustom(Brd_THandle handle, Int32 sym_algo, void* key_custom);

/**
 * 导出对称算法密钥
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        key: 存放密钥数据的内存
 *        key_len: 存放密钥数据的内存长度
 * @return 当返回值 >= 0 时, 表示实际返回的密钥数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoExportSymKey(Brd_THandle handle, Int32 sym_algo, void* key, Int32 key_len);

/**
 * 导出对称算法密钥, 定制化
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        key_custom: 定制化密钥数据, 参见对应算法的KeyCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoExportSymKeyCustom(Brd_THandle handle, Int32 sym_algo, void* key_custom);

/**
 * 对称算法加密
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        plaintext: 明文数据
 *        plain_len: 明文数据长度
 *        ciphertext: 存放密文数据的内存
 *        cipher_len: 存放密文数据的内存长度
 * @return 当返回值 >= 0 时, 表示实际返回的密文数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoEncryptSym(Brd_THandle handle, Int32 sym_algo, const void* plaintext, Int32 plain_len, void* ciphertext, Int32 cipher_len);

/**
 * 对称算法加密, 定制化
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        crypt_custom: 定制化参数, 参见对应算法的CryptCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoEncryptSymCustom(Brd_THandle handle, Int32 sym_algo, void* crypt_custom);

/**
 * 对称算法解密
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        ciphertext: 密文数据
 *        cipher_len: 密文数据长度
 *        plaintext: 存放明文数据的内存
 *        plain_len: 存放明文数据的内存长度
 * @return 当返回值 >= 0 时, 表示实际返回的明文数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoDecryptSym(Brd_THandle handle, Int32 sym_algo, const void* ciphertext, Int32 cipher_len, void* plaintext, Int32 plain_len);

/**
 * 对称算法解密, 定制化
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        crypt_custom: 定制化参数, 参见对应算法的CryptCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoDecryptSymCustom(Brd_THandle handle, Int32 sym_algo, void* crypt_custom);

/**
 * 对称算法签名, 定制化
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        sign_custom: 定制化参数, 参见对应算法的SignCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoSignSymCustom(Brd_THandle handle, Int32 sym_algo, void* sign_custom);

/**
 * 对称算法验签, 定制化
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        sign_custom: 定制化参数, 参见对应算法的SignCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoVerifySymCustom(Brd_THandle handle, Int32 sym_algo, void* sign_custom);

/** ################################### 非对称加密算法接口 ######################################## */

/**
 * 判断非对称算法密钥是否为空
 * @param handle: 句柄
 *        sym_algo: 对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoSymTag)
 *        key_index: 密钥索引
 *        empty: 密钥是否为空
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoIsAsymKeyEmpty(Brd_THandle handle, Int32 asym_algo, Int32 key_index, Bool* empty);

/**
 * 产生非对称算法密钥, 包括公钥和私钥
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoGenerateAsymKey(Brd_THandle handle, Int32 asym_algo);

/**
 * 产生非对称算法密钥, 包括公钥和私钥, 定制化
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        key_custom: 定制化密钥数据, 参见对应算法的KeyCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoGenerateAsymKeyCustom(Brd_THandle handle, Int32 asym_algo, void* key_custom);

/**
 * 导入非对称算法对方的公钥
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        pub_key: 公钥数据
 *        key_len: 公钥数据长度
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoImportAsymPubKey(Brd_THandle handle, Int32 asym_algo, const void* pub_key, Int32 key_len);

/**
 * 导入非对称算法对方的公钥, 定制化
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        key_custom: 定制化密钥数据, 参见对应算法的KeyCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoImportAsymPubKeyCustom(Brd_THandle handle, Int32 asym_algo, void* key_custom);

/**
 * 导出非对称算法自身公钥
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        pub_key: 存放公钥数据的内存
 *        key_len: 存放公钥数据的内存长度
 * @return 当返回值 >= 0 时, 表示实际返回的公钥数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoExportAsymPubKey(Brd_THandle handle, Int32 asym_algo, void* pub_key, Int32 key_len);

/**
 * 导出非对称算法自身公钥, 定制化
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        key_custom: 定制化密钥数据, 参见对应算法的KeyCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoExportAsymPubKeyCustom(Brd_THandle handle, Int32 asym_algo, void* key_custom);

/**
 * 非对称算法加密
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        plaintext: 明文数据
 *        plain_len: 明文数据长度
 *        ciphertext: 存放密文数据的内存
 *        cipher_len: 存放密文数据的内存长度
 * @return 当返回值 >= 0 时, 表示实际返回的密文数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoEncryptAsym(Brd_THandle handle, Int32 asym_algo, const void* plaintext, Int32 plain_len, void* ciphertext, Int32 cipher_len);

/**
 * 非对称算法加密, 定制化
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        crypt_custom: 定制化参数, 参见对应算法的CryptCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoEncryptAsymCustom(Brd_THandle handle, Int32 asym_algo, void* crypt_custom);

/**
 * 非对称算法解密
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        ciphertext: 密文数据
 *        cipher_len: 密文数据长度
 *        plaintext: 存放明文数据的内存
 *        plain_len: 存放明文数据的内存长度
 * @return 当返回值 >= 0 时, 表示实际返回的明文数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoDecryptAsym(Brd_THandle handle, Int32 asym_algo, const void* ciphertext, Int32 cipher_len, void* plaintext, Int32 plain_len);

/**
 * 非对称算法解密, 定制化
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        crypt_custom: 定制化参数, 参见对应算法的CryptCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoDecryptAsymCustom(Brd_THandle handle, Int32 asym_algo, void* crypt_custom);

/**
 * 非对称算法签名
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        msg: 需要签名的信息
 *        msg_len: 需要签名的信息长度
 *        sign: 存放签名数据的内存
 *        sign_len: 存放签名数据的内存长度
 * @return 当返回值 >= 0 时, 表示实际返回的签名数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoSignAsym(Brd_THandle handle, Int32 asym_algo, const void* msg, Int32 msg_len, void* sign, Int32 sign_len);

/**
 * 非对称算法签名, 定制化
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        sign_custom: 定制化参数, 参见对应算法的SignCustom结构类型
 * @return 当返回值 >= 0 时, 表示成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoSignAsymCustom(Brd_THandle handle, Int32 asym_algo, void* sign_custom);

/**
 * 非对称算法验签
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        msg: 验证签名的原始信息
 *        msg_len: 验证签名的原始信息长度
 *        sign: 存放签名数据的内存
 *        sign_len: 存放签名数据的内存长度
 * @return 当返回值 >= 0 时, 表示验签成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoVerifyAsym(Brd_THandle handle, Int32 asym_algo, const void* msg, Int32 msg_len, const void* sign, Int32 sign_len);

/**
 * 非对称算法验签, 定制化
 * @param handle: 句柄
 *        asym_algo: 非对称算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoAsymTag)
 *        sign_custom: 定制化参数, 参见对应算法的SignCustom结构类型
 * @return 当返回值 >= 0 时, 表示验签成功 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoVerifyAsymCustom(Brd_THandle handle, Int32 asym_algo, void* sign_custom);

/** ################################### 摘要算法接口 ######################################## */

/**
 * 计算摘要
 * @param handle: 句柄
 *        digest_algo: 摘要算法类型, 参见[brd_crypto_def](@ref Brd_TCryptoDigestTag)
 *        msg: 原始信息
 *        msg_len: 原始信息长度
 *        digest: 摘要数据
 *        digest_len: 摘要数据长度
 * @return 当返回值 >= 0 时, 表示实际返回的摘要数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoComputeDigest(Brd_THandle handle, Int32 digest_algo, const void* msg, Int32 msg_len, void* digest, Int32 digest_len);

/** ################################### 其他 ######################################## */

/**
 * 随机数
 * @param handle: 句柄
 *        random: 存放随机数的内存
 *        random_len: 存放随机数的内存长度
 * @return 当返回值 >= 0 时, 表示实际返回的随机数数据长度 \n
 *         当返回值 < 0 时, 表示失败, 参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_CryptoGenerateRandom(Brd_THandle handle, void* random, Int32 random_len);

#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif // _BRD_CRYPTO_H_
/**
 * @} 
 */
